import { Pipe, PipeTransform } from '@angular/core';

/**
 * 数字简化管道
 * 
 * 功能：
 * - 将大数字转换为简短的格式（如 1000 -> 1K，1000000 -> 1M）
 * - 支持短格式（K, M, B, T, Q）和长格式（thousand, million, billion 等）
 * 
 * 使用示例：
 * ```html
 * <!-- 短格式 -->
 * {{ 1500 | shortNumber }}     <!-- 输出: 1.5K -->
 * {{ 2500000 | shortNumber }}  <!-- 输出: 2.5M -->
 * 
 * <!-- 长格式 -->
 * {{ 1500 | shortNumber: {long: true} }}   <!-- 输出: 1.5 thousand -->
 * {{ 2500000 | shortNumber: {long: true} }} <!-- 输出: 2.5 million -->
 * ```
 */
@Pipe({
  name: 'shortNumber'
})
export class ShortNumberPipe implements PipeTransform {

  /**
   * 转换数字为简短格式
   * 
   * @param number - 要转换的数字
   * @param args - 可选参数，支持 {long: true} 以使用长格式
   * @returns 格式化后的字符串
   */
  transform(number: number, args?: any): any {
    // 边界情况处理
    if (isNaN(number)) return 0;  // 非数字返回 0
    if (number === null) return 0; // null 值返回 0
    if (number === 0) return 0;   // 零返回 0
    
    let abs = Math.abs(number);      // 取绝对值
    const rounder = Math.pow(10, 1); // 保留1位小数（四舍五入精度）
    const isNegative = number < 0;   // 是否为负数
    const isLong = args && args.long; // 是否使用长格式
    let key = '';                     // 单位后缀

    // 定义单位映射表：千万亿、万亿、十亿、百万、千
    const powers = [
      {key: 'Q', longKey: ' quadrillion', value: Math.pow(10, 15)}, // 千万亿
      {key: 'T', longKey: ' trillion', value: Math.pow(10, 12)},    // 万亿
      {key: 'B', longKey: ' billion', value: Math.pow(10, 9)},     // 十亿
      {key: 'M', longKey: ' million', value: Math.pow(10, 6)},     // 百万
      {key: 'K', longKey: ' thousand', value: 1000}                // 千
    ];

    // 遍历单位，找到合适的转换单位
    for (let i = 0; i < powers.length; i++) {
      let reduced = abs / powers[i].value;  // 转换为当前单位
      reduced = Math.round(reduced * rounder) / rounder; // 四舍五入到1位小数
      
      if (reduced >= 1) {
        abs = reduced;
        // 根据参数选择短格式（K, M, B 等）或长格式（thousand, million 等）
        key = isLong ? powers[i].longKey : powers[i].key;
        break;
      }
    }
    
    // 返回带符号的格式化结果
    return (isNegative ? '-' : '') + abs + key;
  }
}
